<?php

/**
 *
 * @todo Якщо не переданий параметр - записувати порожню стрічку - ексесор сет
 *
 */
class Application_Model_Company
{
    protected $_id;
    protected $_name;
    protected $_desc;
    protected $_telefon;
    protected $_adresa;
    protected $_site;
    protected $_level;
    protected $_created;
    protected $_updated;
    protected $_url;

    protected $_category;
    protected $_tags = array();

    /********************************************************************/
    public function  __construct(array $options = null)
    {
        if (is_array($options)) {
            $this->setOptions($options);
        }
    }

     public function setOptions(array $options)
    {
        $methods = get_class_methods($this);

        foreach ($options as $key => $value) {
            $method = "set" . ucfirst($key);

            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }

        return $this;
    }

    /*  public function  __set($name,  $value)
    {
        $method = "set" . ucfirst($name);

        if (method_exists($this, $method)) {
            $this->$method($value);
        } else throw new Exception('oops) no such parameter to set');

    }

    public function __get($name)
    {
        $method = 'get' . ucfirst($name);

        if (method_exists($this, $method)) {
            return $this->$method($value);
        } else throw new Exception('oops) no such parameter to get');
    }  */

    /********************************************************************/
    public function setId($id)
    {
        // Максимум 5 цифр
        $regExp = '/^[0-9]{1,5}$/';
        if (!preg_match($regExp, $id)) throw new Exception("Oops) $id is not a valid id!");
        $id = (int) $id;
        if ($id > 65535) throw new Exception("To large Id ($id): max 65 535");
        
        $this->_id = $id;
        return $this;
    }

    public function getId()
    {
        return $this->_id;
    }
    /********************************************************************/
    public function setName($name)
    {
        if ($name == '') throw new Exception('Company name could not be empty!');

        $this->_name = (string) $name;
        return $this;
    }

    public function  getName()
    {
        return $this->_name;
    }

    /********************************************************************/
    public function setDesc($desc)
    {        
        $this->_desc = (string) $desc;
        return $this;
    }

    public function getDesc()
    {
        return $this->_desc;
    }

    /********************************************************************/
    public function setTelefon($telefon)
    {
        if (is_null($telefon) || $telefon == '') {
            $this->_telefon = '';
            return $this;
        }

        // Телефон: може починатись "+" і містить цифри, які можуть розділятись 
        // через "-"
        $regExp = '/'
                . '^\+?'
                . '[0-9]+'
                . '(-[0-9]+)*'
                . '$/';

        if (!preg_match($regExp, $telefon)) throw new Exception("oops) '$telefon' is not a valid phone number!");

        $this->_telefon = (string) $telefon;
        return $this;
    }

    public function getTelefon(){
        return $this->_telefon;
    }

    /********************************************************************/
    public function setAdresa($adresa)
    {
        $this->_adresa = (string) $adresa;
        return $this;
    }

    public function getAdresa()
    {
        return $this->_adresa;
    }

    /********************************************************************/
    public function setSite($site)
    {
        if (is_null($site) || $site == '') {
            $this->_site = '';
            return $this;
        }

        // URL сайту (регулярний вираз)
        // Починається з протоколу (може бути відсутнім)

        // Далі буквенно-цифрове слово, з довільною кількість б-ц слів,
        // приєднаних через тире

        // Далі довільна кількість приєднаних через крапку слів, що відповідають
        // попередній умові

        // Дальше крапка і буквенне слово

        // Далі може бути блок що починається зі слеша, після якого довільні
        // символи в любій кількості
        // ^(http:\/\/|https:\/\/)?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*(\.[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)*(\.[a-zA-Z]+)(\/.*)?$
        $regExp = '/'
                . '^(http:\/\/|https:\/\/)?'
                . '[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*'
                . '(\.[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)*'
                . '(\.[a-zA-Z]+)'
                . '(\/.*)?$'
                . '/';

        if (!preg_match($regExp, $site)) throw new Exception("oops) '$site' is not a valid site!");
        $this->_site = (string) $site;
        return $this;
    }

    public function getSite()
    {
        return $this->_site;
    }

    /********************************************************************/
    public function setLevel($level)
    {
        $good = array(0, 1);

        $level = (int) $level;
        if (in_array($level, $good)) {
            $this->_level = $level;
        } else throw new Exception("oops) '$level'is not a valid level value: could be only 1 or 0");

        return $this;
    }

    public function getLevel()
    {
        return $this->_level;
    }

    /********************************************************************/
    public function setCreated($created)
    {
        
        // Часова мітка юнікс - 10 цифр
        //$regExp = '/^[0-9]{10}$/';

        // YYYY-MM-DD HH:MM:SS
        $regExp = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/';
        if (!preg_match($regExp, $created)) throw new Exception("oops) '$created' is not a valid date-time!");

        $this->_created = (string) $created;
        return $this;
    }

    public function getCreated()
    {
        return $this->_created;
    }

    /********************************************************************/
    public function setUpdated($updated)
    {
        // 10 цифр
        //$regExp = '/^[0-9]{10}$/';

        // YYYY-MM-DD HH:MM:SS
        $regExp = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/';
        if (!preg_match($regExp, $updated)) throw new Exception("oops) '$updated' is not a valid date-time!");

        $this->_updated = (string) $updated;
        return $this;
    }

    public function getUpdated()
    {
        return $this->_updated;
    }

    /********************************************************************/

    /**
     *
     * @param string $url
     * @return Application_Model_Company
     * 
     */
    public function setUrl($url)
    {
        // Букви, цифри, тире. Починатись може лише з букви або цифри.
        $regExp = '/^'
                . '[a-zA-Z0-9]+'
                . '[a-zA-Z0-9-]*'
                . '[a-zA-Z0-9]'
                . '$/';
        if (!preg_match($regExp, $url)) throw new Exception("Invalid url '$url' !");

        $regExp = '/^[0-9]+$/';
        if (preg_match($regExp, $url)) throw new Exception("Invalid url '$url' :: Company-url can not contain numbers only!");


        $this->_url = (string) $url;
        return $this;
    }

    public function getUrl()
    {
        return $this->_url;
    }

    /********************************************************************/
    
    public function setCategory(/*Application_Model_Category */$category)
    {
        if ($category instanceof Application_Model_Category) {
            $this->_category = $category;
        } else throw new Exception('Invalid category object');

        return $this;
    }
    
    /**
     *
     * @return Application_Model_Category
     * 
     */
    public function getCategory()
    {
        return $this->_category;
    }
    /********************************************************************/

    public function setTags($tags)
    {   //@todo Переробити
        if ($tags instanceof Application_Model_Tag) {
            $this->addTag($tags);
        } else if (!is_array($tags)) {
            throw new Exception('Invalid tags: must be array or single tag');
        } else {
            foreach ($tags as $tag) {
                $this->addTag($tag);
            }
        }

        return $this;
    }

    public function addTag($tag)
    {
        if ($tag instanceof Application_Model_Tag) {
            $this->_tags[] = $tag;
        } else throw new Exception('Invalid tag!');

        return $this;
    }

    public function getTags()
    {
        return $this->_tags;
    }

    /********************************************************************/

}

?>
